package com.dmgameclient.common;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ImageView;

/**
 * @name 网络图片适配器处理类
 * @Descripation <br>
 *               1、适用范围：listView/GridView/ViewPager等使用Adapter适配图文混排，
 *               在getView方法中使用此类的对象。<br>
 *               2、列表上下滚动时图片会产生错位现象的解决：使用唯一标志位tag（可以是图片的url）进行标记。<br>
 *               3、列表上下滚动时多条线程重复下载同一张图片造成资源浪费问题的解决：同步监视器和tag配合使用。<br>
 *               4、图片缓存问题，使用内存缓存和SDCard缓存，优先查找一级缓存，其次查找二级缓存，均无时下载，下载完毕后添加到两个缓存中。<br>
 *               5、其它问题：设置默认图片、图片尺寸、OOM。<br>
 * @author 樊俊彬
 * @date 2014-9-10
 * @version 1.0
 */

public class AdapterImageUtils {

	private MemoryCache memoryCache;
	private SDCardCache sdCardCache;
	private View view;
	private int requestWidth;
	private int requestHeigh;
	private int defaultImageResouceId;

	public AdapterImageUtils(Context context, View view,
			int defaultImageResouceId, int requestWidth, int requestHeight) {
		this.view = view;
		this.defaultImageResouceId = defaultImageResouceId;
		this.requestWidth = requestWidth;
		this.requestHeigh = requestHeight;
		memoryCache = new MemoryCache(context);
		sdCardCache = new SDCardCache();
	}

	/**
	 * 处理图片
	 * 
	 * @param imageView
	 * @param url
	 * @param folder
	 * @param fileName
	 */
	public void executeImageView(ImageView imageView, int tag, String url,
			String folder, String fileName) {
		if (url != null && folder != null && fileName != null) {

			// 设置唯一标志，防止列表滚动时显示图片错误现象
			imageView.setTag(url);

			// 指定默认图片
			imageView.setImageResource(defaultImageResouceId);

			// 优先查找一级缓存中是否已该有图片，有则加载，无则查找二级缓存，有则加载，无则下载
			if (memoryCache.getBitmapByKey(url) == null) {
				if (!sdCardCache.isFileExist(fileName, folder)) {
					// 不应让线程重复下载同一张图片
					synchronized (imageView) {
						DownloadImageTask task = new DownloadImageTask(url,
								folder, fileName, tag);
						imageView.setTag(tag, task);
						task.execute();
					}
				} else {
					// 二级缓存中存放原图，应调整为要求大小图片显示
					Bitmap bitmap = BitmapUtils.decodeBitmap(
							sdCardCache.readImageByPath(fileName, folder),
							requestWidth, requestHeigh);
					imageView.setImageBitmap(bitmap);
				}
			} else {
				imageView.setImageBitmap(memoryCache.getBitmapByKey(url));
			}
		}
	}

	/**
	 * @name 使用异步线程下载图片
	 * @Descripation <br>
	 */
	class DownloadImageTask extends AsyncTask<Void, Void, byte[]> {

		private String url;
		private String folder;
		private String fileName;
		private int tag;

		public DownloadImageTask(String url, String folder, String fileName,
				int tag) {
			this.url = url;
			this.folder = folder;
			this.fileName = fileName;
			this.tag = tag;
		}

		@Override
		protected byte[] doInBackground(Void... params) {
			// TODO Auto-generated method stub
			return HttpUtils.downloadImage(url);
		}

		@Override
		protected void onPostExecute(byte[] result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);

			if (result != null) {
				// 指定大小解析下载的图片
				Bitmap bitmap = BitmapUtils.decodeBitmap(result, requestWidth,
						requestHeigh);

				// 根据唯一标志找图片，防止产生错位
				ImageView imageView = (ImageView) view.findViewWithTag(url);
				if (imageView != null) {
					imageView.setImageBitmap(bitmap);
					imageView.setTag(tag, null);
				}

				// 加入两级缓存(一级缓存中存入压缩图，二级缓存中存放原图)
				memoryCache.addBitmap(url, bitmap);
				sdCardCache.writeImageByPath(folder, fileName, result);
			}
		}
	}
}